package com.zsj.stack;


import java.util.ArrayDeque;
import java.util.Queue;

/**
 * @Author zsj
 * @Version 1.0
 * @Date 2024/3/25 15:06
 * @Description 单队列模拟栈 力扣225
 */
public class QueueToStackQuestion {

    public static void main(String[] args) {
        QueueToStackQuestion question = new QueueToStackQuestion();
        question.push(1);
        question.push(2);
        question.push(3);
        System.out.println(question.pop());
        question.push(4);
        System.out.println(question.pop());
        System.out.println(question.pop());
        System.out.println(question.pop());
    }

//    LinkedListQueue<Integer> queue = new LinkedListQueue<>(100);
    //压栈


    Queue<Integer> queue = new ArrayDeque<>();
    //维护队列元素个数
    private static int size = 0;

    /**
     * 因为是用队列来模拟栈 所以在队列offer进元素的时候
     * 每次都是将元素添加到队尾 但是我们实现栈结构是需要将元素添加到队头 使其有一个后入先出的特性
     * 所以每次添加完元素之前 需要记录元素的个数 在添加完元素之后 循环元素个数 将其重新加入队列 也就是 queue.offer(queue.poll)
     *
     * @param x
     */
    public void push(int x) {
        queue.offer(x);
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
        size++;
    }

    //移除栈顶元素
    public int pop() {
        if (!queue.isEmpty()) {
            Integer poll = queue.poll();
            size--;
            return poll;
        }
        return 0;
    }

    //返回栈顶元素
    public int top() {
        if (!queue.isEmpty()) {
            return queue.peek();
        }
        return 0;
    }

    //栈为空
    public boolean empty() {
        return queue.isEmpty();
    }


}

class MyStack {
    Queue<Integer> queue = new ArrayDeque<>();

    //维护队列元素个数
    private static int size = 0;

    public void push(int x) {
        queue.offer(x);
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
        size++;
    }

    //移除栈顶元素
    public int pop() {
        if (!queue.isEmpty()) {
            return queue.poll();
        }
        return 0;
    }

    //返回栈顶元素
    public int top() {
        if (!queue.isEmpty()) {
            return queue.peek();
        }
        return 0;
    }

    //栈为空
    public boolean empty() {
        return queue.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */